package com.hs.archive_app

import android.app.Application
import androidx.multidex.BuildConfig
import com.alibaba.android.arouter.launcher.ARouter
import com.hs.framework.helper.HsAppHelper
import com.hs.framework.manager.AppManager
import com.hs.framework.utils.MMKVUtil
import com.hs.stater.task.Task
import com.hs.stater.utils.DispatcherExecutor
import java.util.concurrent.ExecutorService

/**
 * 初始化启动任务
 */

/**
 * 初始化全局帮助类
 */
class InitSumHelperTask(val application: Application) : Task() {
    //异步线程执行的Task在被调用await的时候等待
    override fun needWait(): Boolean {
        return true
    }

    override fun run() {
        var start : Long = System.currentTimeMillis()
//        println("-------HSApplication- InitSumHelperTask--start--------${start}--")
        HsAppHelper.init(application, BuildConfig.DEBUG)
//        var start : Long = System.currentTimeMillis()
        println("-------HSApplication- InitSumHelperTask--end--------${System.currentTimeMillis() - start}--")
    }
}

/**
 * 初始化MMKV
 */
class InitMmkvTask() : Task() {

    //异步线程执行的Task在被调用await的时候等待
    override fun needWait(): Boolean {
        return true
    }

    //依赖某些任务，在某些任务完成后才能执行
    override fun dependsOn(): MutableList<Class<out Task>> {
        val tasks = mutableListOf<Class<out Task?>>()
        tasks.add(InitSumHelperTask::class.java)
        return tasks
    }

    //指定线程池
    override fun runOn(): ExecutorService? {
        return DispatcherExecutor.iOExecutor
    }

    //执行任务初始化
    override fun run() {
//        val rootDir: String = MMKV.initialize(HsAppHelper.getApplication())
//        MMKV.setLogLevel(
//            if (BuildConfig.DEBUG) {
//                MMKVLogLevel.LevelDebug
//            } else {
//                MMKVLogLevel.LevelError
//            }
//        )

        var start : Long = System.currentTimeMillis()
//        println("-------HSApplication- MMKVUtil--start--------${start}--")
        MMKVUtil.init(HsAppHelper.getApplication())
//        LogUtil.d("mmkv root: $rootDir", tag = "MMKV")
        println("-------HSApplication- MMKVUtil--end--------${System.currentTimeMillis() - start}--")
    }
}

/**
 * 初始化AppManager
 */
class InitAppManagerTask() : Task() {
    //异步线程执行的Task在被调用await的时候等待
    override fun needWait(): Boolean {
        return true
    }

    //依赖某些任务，在某些任务完成后才能执行
    override fun dependsOn(): MutableList<Class<out Task>> {
        val tasks = mutableListOf<Class<out Task?>>()
        tasks.add(InitSumHelperTask::class.java)
        return tasks
    }

    override fun run() {
        var start : Long = System.currentTimeMillis()
//        println("-------HSApplication- AppManager--start--------${start}--")
        AppManager.init(HsAppHelper.getApplication())
        println("-------HSApplication- AppManager--end--------${System.currentTimeMillis() - start}--")
    }
}

/**
 * 全局初始化SmartRefreshLayout
 */
class InitRefreshLayoutTask() : Task() {
    //异步线程执行的Task在被调用await的时候等待
    override fun needWait(): Boolean {
        return true
    }

    override fun run() {
        //设置全局的Header构建器
//        SmartRefreshLayout.setDefaultRefreshHeaderCreator { context, layout ->
//            layout.setPrimaryColorsId(android.R.color.white)
////            CustomRefreshHeader(context)
//            ClassicsHeader(context)
//        }
//        //设置全局的Footer构建器
//        SmartRefreshLayout.setDefaultRefreshFooterCreator { context, layout ->
//            //指定为经典Footer，默认是 BallPulseFooter
//            ClassicsFooter(context)
//        }
    }
}

/**
 * 初始化ShareManager
 */
class InitArouterTask() : Task() {
    //异步线程执行的Task在被调用await的时候等待
    override fun needWait(): Boolean {
        return true
    }

    //依赖某些任务，在某些任务完成后才能执行
    override fun dependsOn(): MutableList<Class<out Task>> {
        val tasks = mutableListOf<Class<out Task?>>()
        tasks.add(InitSumHelperTask::class.java)
        return tasks
    }

    //执行任务，任务真正的执行逻辑
    override fun run() {
        // 这两行必须写在init之前，否则这些配置在init过程中将无效
        if (BuildConfig.DEBUG) {
            // 开启打印日志
            ARouter.openLog()
            // 开启调试模式(如果在InstantRun模式下运行，必须开启调试模式！线上版本需要关闭,否则有安全风险)
            ARouter.openDebug()
        }
        var start : Long = System.currentTimeMillis()
//        println("-------HSApplication- ARouter--start--------${start}--")
        ARouter.init(HsAppHelper.getApplication())
        println("-------mCountDownLatch- ARouter--end--------${System.currentTimeMillis() - start}--")
    }
}

/**
 * 初始化A
 */
class InitTaskA() : Task() {

    override fun run() {
        //...
    }
}

/**
 * 初始化B
 */
class InitTaskB() : Task() {

    override fun run() {
        //...
    }
}